﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Data;
using SIM.Geo.UI;
using Proxy;
using SIM.Util;

namespace SIM.Geo.UI
{
    public class SimExcelReader
    {
        /// <summary>
        /// Realiza importación de Leyes, utiliza OpenXML
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        public List<MuestraSondajeImportacion> CargarLeyes(string fileName)
        {
            try
            {
                WorkbookPart workbookPart; 

                var document = SpreadsheetDocument.Open(fileName, true);
                workbookPart = document.WorkbookPart;

                var sheets = workbookPart.Workbook.Descendants<Sheet>();
                var sheet = sheets.First();

                var workSheet = ((WorksheetPart)workbookPart
                    .GetPartById(sheet.Id)).Worksheet;
                var columns = workSheet.Descendants<Columns>().FirstOrDefault();

                var sheetData = workSheet.Elements<SheetData>().First();

                int i = 0;
                string value;
                string valueMuestra;
                int j = 0;

                DTOMuestraSondajeImport muestrax = null;
                List<DTOMuestraSondajeImport> muestras = new List<DTOMuestraSondajeImport>();

                foreach (Row r in sheetData.Elements<Row>().ToList())
                {

                    if (r.Elements<Cell>().Count() == 6)
                    {
                        j = 0;
                        foreach (Cell c in r.Elements<Cell>())
                        {
                            valueMuestra = string.Empty;
                            if (c != null)
                            {
                                value = c.InnerText;

                                if (c.DataType != null)
                                {
                                    switch (c.DataType.Value)
                                    {
                                        case CellValues.SharedString:
                                            var stringTable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
                                            if (stringTable != null)
                                            {
                                                value = stringTable.SharedStringTable.
                                                  ElementAt(int.Parse(value)).InnerText;
                                                valueMuestra = value;
                                            }
                                            break;
                                        case CellValues.Boolean:
                                            switch (value)
                                            {
                                                case "0":
                                                    value = "FALSE";
                                                    break;
                                                default:
                                                    value = "TRUE";
                                                    break;
                                            }
                                            break;
                                    }
                                }
                            }
                            if (j == 0)
                                muestrax = new DTOMuestraSondajeImport();

                            if (j == 0) muestrax.CodigoMuestraSondaje = valueMuestra;
                            if (j == 1) muestrax.ValorAg = valueMuestra;
                            if (j == 2) muestrax.ValorCu = valueMuestra;
                            if (j == 3) muestrax.ValorPb = valueMuestra;
                            if (j == 4) muestrax.ValorZn = valueMuestra;
                            if (j == 5) muestrax.ValorFe = valueMuestra;

                            j += 1;
                        }

                        if (muestrax != null)
                            muestras.Add(muestrax);
                        muestrax = null;
                    }
                    i = i + 1;
                }

                //Filtra items válidos
                int longitudCodigoMuestra = int.Parse(System.Configuration.ConfigurationManager.AppSettings["longitudCodigoMuestraImportar"]);
                var muestraValidos = muestras.Where(x => x.CodigoMuestraSondaje.Length == longitudCodigoMuestra && Funciones.IsNumeric(x.CodigoMuestraSondaje.Substring(0, 7)) && x.CodigoMuestraSondaje.Contains("D")).ToList();

                //Reemplazo los datos no Validos y genera Nueva lista
                MuestraSondajeImportacion muestra = new MuestraSondajeImportacion();
                List<MuestraSondajeImportacion> muestraImportadas = new List<MuestraSondajeImportacion>();

                foreach (var item in muestraValidos)
                {
                    muestra = new MuestraSondajeImportacion();
                    item.ValorAg = (item.ValorAg != null) ? item.ValorAg.Replace('<', ' ') : item.ValorAg = string.Empty;
                    item.ValorPb = (item.ValorPb != null) ? item.ValorPb.Replace('<', ' ') : item.ValorPb = string.Empty;
                    item.ValorZn = (item.ValorZn != null) ? item.ValorZn.Replace('<', ' ') : item.ValorZn = string.Empty;
                    item.ValorCu = (item.ValorCu != null) ? item.ValorCu.Replace('<', ' ') : item.ValorCu = string.Empty;
                    item.ValorFe = "-1";

                    if (item.ValorAg == "") item.ValorAg = "-1";
                    if (item.ValorPb == "") item.ValorPb = "-1";
                    if (item.ValorZn == "") item.ValorZn = "-1";
                    if (item.ValorCu == "") item.ValorCu = "-1";

                    muestra.CodigoMuestraSondaje = item.CodigoMuestraSondaje;
                    if (Funciones.IsNumeric(item.ValorAg)) muestra.ValorAg = float.Parse(item.ValorAg);
                    if (Funciones.IsNumeric(item.ValorPb)) muestra.ValorPb = float.Parse(item.ValorPb);
                    if (Funciones.IsNumeric(item.ValorZn)) muestra.ValorZn = float.Parse(item.ValorZn);
                    if (Funciones.IsNumeric(item.ValorCu)) muestra.ValorCu = float.Parse(item.ValorCu);
                    if (Funciones.IsNumeric(item.ValorFe)) muestra.ValorFe = float.Parse(item.ValorFe);

                    muestraImportadas.Add(muestra);
                }

                document.Close();
                document.Dispose();
                document = null;

                return muestraImportadas;

            }
            catch (Exception ex)
            {
                Logger.Error("SimExcelReader:CargarLeyes", ex);
                return null;
            }
        }
    }
}